<template>
  <div class="diagnosis-container">
    <!-- 顶部药品搜索 -->
    <MedicineSearch
      ref="medicineSearchRef"
      :departments="departments"
      :selected-medicines="selectedMedicines"
      :is-system-stopped="isSystemStopped"
      @medicine-toggle="toggleMedicine"
    />

    <div class="main-layout">
      <!-- 左侧诊断区域 -->
      <div class="left-panel">
        <DiagnosisForm
          v-model:progress-steps="progressSteps"
          v-model:symptoms="symptoms"
          v-model:description="description"
          :is-system-stopped="isSystemStopped"
          @update:rehab="handleRehabUpdate"
          @update:currentResId="handleUpdateCurrentResId"
          :advice-data="adviceData"
        />
      </div>

      <!-- 右侧病人列表（包含标题和场次信息） -->
      <div class="right-panel">
        <!-- 病人列表标题栏 -->
        <div class="patient-list-header">
          <h2 class="list-title">
            就诊病人列表
            <span class="session-tag">{{ currentSession }}</span>
          </h2>
          <div class="patient-count">
            总人数: {{ patients.length }}人
          </div>
        </div>

        <!-- 病人列表内容 -->
        <PatientList
          :patients="patients"
          :current-patient="currentPatient"
          @patient-select="selectPatient"
        />
      </div>
    </div>

    <!-- 底部药品清单 -->
    <MedicineCart
      :cart-items="cartItems"
      :total-items="totalItems"
      :can-submit="canSubmit"
      :is-system-stopped="isSystemStopped"
      @increase-quantity="increaseQuantity"
      @decrease-quantity="decreaseQuantity"
      @submit="submitPrescription"
      @cancel="cancelVisit"
      @toggle-system="toggleSystem"
    />

    <!-- 病人详情弹窗 -->
    <PatientDetailModal
      :show="showPatientDetailModal"
      :patient="selectedPatientDetail"
      @close="showPatientDetailModal = false"
      :format-timestamp="formatTimestamp"
    />
  </div>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue'
import MedicineSearch from './components/MedicineSearch.vue'
import DiagnosisForm from './components/DiagnosisForm.vue'
import PatientList from './components/PatientList.vue'
import MedicineCart from './components/MedicineCart.vue'
import PatientDetailModal from './components/PatientDetailModal.vue'
import request from '@/utils/request'

// 响应式数据
const symptoms = ref('')
const description = ref('')
const selectedMedicines = ref([])
const currentPatient = ref(null)
const isSystemStopped = ref(false)
const showPatientDetailModal = ref(false)
const selectedPatientDetail = ref({})
const cartItems = ref([])
const patients = ref([])
const medicineSearchRef = ref(null)
const currentResId = ref('');

// 同步子组件传递的 resId（需在父组件中监听子组件的 update:currentResId 事件）
const handleUpdateCurrentResId = (resId) => {
  currentResId.value = resId; // 确保该方法在父组件中正确实现
};

//预约建议
const rehabMode = ref('selection') // 'selection' 选择模式 / 'other' 手写模式
const rehabContent = ref({
  diet: '',
  sports: '',
  sleep: '',
  other: ''
})

// 康复建议数据
const adviceData = ref({
  diet: [],
  sports: [],
  sleep: []
})

// 科室列表
const departments = ref([
  '呼吸内科', '消化内科', '神经内科', '心血管内科',
  '肾内科', '血液内科', '免疫科', '内分泌科',
  '普通外科', '神经外科', '心胸外科', '泌尿外科',
  '心血管外科', '乳腺外科', '肝胆外科', '器官移植',
  '肛肠外科', '烧伤科', '骨外科', '妇科',
  '产科', '计划生育', '妇幼保健', '前列腺专科',
  '男性生殖健康', '儿科综合', '小儿内科', '小儿外科',
  '新生儿科', '儿童营养保健科', '耳鼻喉科', '眼科',
  '口腔科', '肿瘤内科', '肿瘤外科', '放疗科',
  '皮肤科', '性病科', '中医内科', '针灸按摩科',
  '肝病科', '艾滋病科', '结核病', '寄生虫',
  '精神科', '心理咨询科'
])

// 进度步骤
const progressSteps = ref([
  { label: '已了解该病人基本情况', completed: false },
  { label: '已填写该病人主要症状', completed: false },
  { label: '已填写该病人病情说明', completed: false },
  { label: '已经填写康复建议', completed: false },
])

// 用于存储从后端获取的问卷配置
const questionnaireConfig = ref({});

// 获取问卷配置的函数
const fetchAndSaveQuestionnaire = async () => {
  try {
    const response = await request({
      url: '/department-questionnaire/current', // 正确的接口地址
      method: 'get'
    });

    // 检查响应是否成功
    if (response.code === 200 && Array.isArray(response.data)) {
      console.log("成功获取问卷问题:", response.data);

      // 将获取到的问题数组直接保存到 localStorage
      // 注意：localStorage 只能存储字符串，所以需要用 JSON.stringify 转换
      localStorage.setItem('questionnaire', JSON.stringify(response.data));

    } else {
      console.error("获取问卷失败：", response.msg || "服务器返回未知错误");
    }
  } catch (error) {
    console.error("网络请求异常：", error);
  }
};

// 计算属性
const totalItems = computed(() => cartItems.value.length)
const canSubmit = computed(() => progressSteps.value.every(step => step.completed))

// 场次判断（根据当前时间自动区分）
const currentSession = computed(() => {
  const hour = new Date().getHours()
  if (hour >= 7 && hour < 12) return '上午场'
  if (hour >= 2 && hour < 18) return '下午场'
  return '下班时间'
})

// 方法
const toggleMedicine = (medicine) => {
  if (isSystemStopped.value) return
  const index = selectedMedicines.value.indexOf(medicine.id)
  if (index > -1) {
    selectedMedicines.value.splice(index, 1)
    const cartIndex = cartItems.value.findIndex(item => item.id === medicine.id)
    if (cartIndex > -1) cartItems.value.splice(cartIndex, 1)
  } else {
    selectedMedicines.value.push(medicine.id)
    cartItems.value.push({ id: medicine.id, name: medicine.name, quantity: 1 })
  }
  progressSteps.value[3].completed = cartItems.value.length > 0
}

const selectPatient = (patient) => {
  if (isSystemStopped.value) return
  currentPatient.value = patient
  showPatientDetails(patient)
  // 只有点击第一个病人时才标记第一步完成
  if (patients.value.length > 0 && patient.id === patients.value[0].id) {
    progressSteps.value[0].completed = true
  }
}

const showPatientDetails = (patient) => {
  selectedPatientDetail.value = patient;
  showPatientDetailModal.value = true;
}

const formatTimestamp = (timestamp) => {
  if (!timestamp) return '未知时间'
  return new Date(timestamp).toLocaleString('zh-CN')
}

const increaseQuantity = (index) => {
  if (isSystemStopped.value) return
  cartItems.value[index].quantity++
}

const decreaseQuantity = (index) => {
  if (isSystemStopped.value) return
  if (cartItems.value[index].quantity > 1) {
    cartItems.value[index].quantity--
  } else {
    const medicineId = cartItems.value[index].id
    cartItems.value.splice(index, 1)
    const medIndex = selectedMedicines.value.indexOf(medicineId)
    if (medIndex > -1) selectedMedicines.value.splice(medIndex, 1)
  }
  progressSteps.value[3].completed = cartItems.value.length > 0
}

const submitPrescription = async () => {
  // 原有校验逻辑保留
  if (!canSubmit.value || isSystemStopped.value) return

  // 新增：构造提交数据（严格按要求格式）
  const submitData = {
    ResId: currentResId.value || '', // 预约号
    status: '已提交', // 状态默认值
    symptoms:  localStorage.getItem('symptoms'),
    description: localStorage.getItem('description'),
    rehabMode: rehabMode.value, // 填写建议的模式
    suggestion: {}, // 康复建议（按模式区分）
    other: localStorage.getItem('other'),
    medicine: {} // 药品ID:数量
  };

  // 新增：处理康复建议格式
  if (rehabMode.value === 'selection') {
    submitData.suggestion = {
      diet: rehabContent.value.diet || localStorage.getItem('diet') || '',
      sleep: rehabContent.value.sleep || localStorage.getItem('sleep') || '',
      sports: rehabContent.value.sports || localStorage.getItem('sports') || ''
    };
  } else {
    submitData.suggestion = {
      other: rehabContent.value.other || localStorage.getItem('other') || ''
    };
  }

  // 修复：处理药品格式（兼容 cartItems 非数组情况）
  if (Array.isArray(cartItems.value)) { // 先判断是否为数组
    cartItems.value.forEach(item => {
      // 额外校验 item 格式，避免无效数据
      if (item && item.id && typeof item.quantity === 'number') {
        submitData.medicine[item.id] = item.quantity;
      }
    });
  } else {
    console.warn('cartItems 不是数组，药品信息为空');
    submitData.medicine = {}; // 非数组时设为空对象
  }

  // 新增：发送提交请求
  try {
    const response = await request({
      url: '/api/diagnosis/submit', // 替换为你的后端提交接口
      method: 'post',
      data: submitData
    });

    if (response.code === 200) {
      alert('提交成功！');
    } else {
      alert(`提交失败：${response.msg || '未知错误'}`);
    }
  } catch (error) {
    console.error('提交接口调用异常：', error);
    alert('网络异常，提交失败，请重试！');
  }

  // 原有提交后逻辑保留（删除病人、重置表单等）
  if (currentPatient.value) {
    const index = patients.value.findIndex(p => p.id === currentPatient.value.id)
    if (index > -1) patients.value.splice(index, 1)
  }
  
  // 重置表单
  resetForm()
  
  // 设置下一个病人为当前病人
  if (patients.value.length > 0) {
    currentPatient.value = patients.value[0]
    currentResId.value = patients.value[0].resId || ''
  } else {
    currentPatient.value = null
    currentResId.value = ''
  }
  
  setTimeout(() => {
    alert('处方已成功下发！')
  }, 500)
};

const cancelVisit = async () => {
  // 1. 校验系统状态：已停止则不执行
  if (isSystemStopped.value) {
    alert('系统已停止，无法执行取消就诊操作');
    return;
  }

  // 2. 校验当前病人是否存在
  if (!currentPatient.value || !currentResId.value) {
    alert('未选中有效病人，无法取消就诊');
    return;
  }

  // 3. 弹出确认弹窗，用户确认后执行
  if (confirm('确定要取消本次就诊吗？取消后将删除该病人的就诊记录，不可恢复！')) {
    try {
      // 4. 调用后端取消就诊接口（核心新增：同步删除数据库记录）
      const response = await request({
        url: '/api/diagnosis/updateResolveToTwo', // 后端接口地址（需与之前子组件接口一致）
        method: 'post',
        data: { resId: currentResId.value } // 传递当前病人resId，后端根据resId删除记录
      });

      // 5. 接口调用成功，执行前端本地逻辑
      if (response.code === 200) {
        alert('取消就诊成功');

        // 5.1 从本地病人列表中删除当前病人
        const index = patients.value.findIndex(p => p.id === currentPatient.value.id);
        if (index > -1) {
          patients.value.splice(index, 1);
        }

        // 5.2 重置表单数据（原有逻辑，如清空诊疗信息、药品清单等）
        resetForm();

        // 5.3 自动选中下一个病人（原有逻辑）
        if (patients.value.length > 0) {
          currentPatient.value = patients.value[0];
          // 同步更新 currentResId（关键：确保新选中病人的resId生效）
          currentResId.value = currentPatient.value.resId  || '';
        } else {
          // 若没有其他病人，清空当前病人和resId
          currentPatient.value = {};
          currentResId.value = '';
        }
      } else {
        alert(response.msg || '取消就诊失败，请联系管理员');
      }
    } catch (error) {
      // 网络异常或接口报错
      console.error('取消就诊接口调用异常：', error);
      alert('网络异常，取消就诊失败，请重试');
    }
  }
};

const toggleSystem = () => {
  isSystemStopped.value = !isSystemStopped.value
  if (!isSystemStopped.value) console.log('系统重新开始运行')
}

const handleRehabUpdate = (rehabData) => {
  console.log('康复建议更新：', rehabData)
  rehabMode.value = rehabData.mode;

  // 关键修复：按模式存储对应内容
  if (rehabMode.value === 'other') {
    // 手写模式：content 是字符串，存到 other 字段
    rehabContent.value.other = rehabData.content;
  } else {
    // 选择模式：content 是对象，存到 diet/sports/sleep 字段
    rehabContent.value.diet = rehabData.content.diet || '';
    rehabContent.value.sports = rehabData.content.sports || '';
    rehabContent.value.sleep = rehabData.content.sleep || '';
  }

  // 同步到 localStorage（与子组件键保持一致：rehabilitation_mode）
  if (rehabMode.value === 'other') {
    localStorage.setItem('other', rehabData.content);
    localStorage.removeItem('diet');
    localStorage.removeItem('sports');
    localStorage.removeItem('sleep');
  } else {
    localStorage.setItem('diet', rehabData.content.diet || '');
    localStorage.setItem('sports', rehabData.content.sports || '');
    localStorage.setItem('sleep', rehabData.content.sleep || '');
    localStorage.removeItem('other');
  }
  // 与子组件存储键保持一致：rehabilitation_mode
  localStorage.setItem('rehabilitation_mode', rehabMode.value);
};

const resetForm = () => {
  symptoms.value = ''
  description.value = ''
  selectedMedicines.value = []
  rehabContent.value.other = ''
  cartItems.value = []

  progressSteps.value = [
    { label: '了解病人基本情况', completed: false },
    { label: '已经填写主要症状', completed: false },
    { label: '已经填写病情说明', completed: false },
    { label: '已经填写康复建议', completed: false }
  ]
  //True会报错，这边应该是小写的true
  showPatientDetailModal.value = false
}

const calculateAgeAndGender = (identityCard) => {
  // 最宽松的检查，只要没有身份证号或格式明显不对，就返回默认值
  if (!identityCard || typeof identityCard !== 'string' || identityCard.length < 15) {
    console.warn('身份证号无效或为空，将使用默认性别和年龄。');
    return { age: 30, gender: '男' }; // 提供合理的默认值，防止页面崩溃
  }

  try {
    // --- 计算性别 ---
    // 兼容15位和18位身份证
    const genderCode = parseInt(
      identityCard.length === 18
        ? identityCard.charAt(16)
        : identityCard.charAt(14),
      10
    );
    const gender = !isNaN(genderCode) && genderCode % 2 === 1 ? '男' : '女';

    // --- 计算年龄 ---
    let birthYear, birthMonth, birthDay;
    if (identityCard.length === 18) {
      birthYear = parseInt(identityCard.substring(6, 10), 10);
      birthMonth = parseInt(identityCard.substring(10, 12), 10) - 1; // 月份从0开始
      birthDay = parseInt(identityCard.substring(12, 14), 10);
    } else { // 15位身份证
      birthYear = 1900 + parseInt(identityCard.substring(6, 8), 10);
      birthMonth = parseInt(identityCard.substring(8, 10), 10) - 1;
      birthDay = parseInt(identityCard.substring(10, 12), 10);
    }

    const birthDate = new Date(birthYear, birthMonth, birthDay);
    const today = new Date();

    // 检查出生日期是否有效
    if (isNaN(birthDate.getTime())) {
      throw new Error('解析出的出生日期无效');
    }

    let age = today.getFullYear() - birthDate.getFullYear();
    const hasHadBirthdayThisYear =
      today.getMonth() > birthMonth ||
      (today.getMonth() === birthMonth && today.getDate() >= birthDay);

    if (!hasHadBirthdayThisYear) {
      age--;
    }

    // 确保年龄在合理范围内
    age = Math.max(0, Math.min(120, age));

    return { age, gender };

  } catch (error) {
    console.error('计算年龄和性别时发生错误:', error);
    return { age: 30, gender: '男' }; // 兜底默认值
  }
};

// 2. 从后端获取病人列表并处理 (核心逻辑)
// 从后端获取病人列表并处理 (修复版)
const fetchPatientsFromAPI = () => {
  request({
    url: '/patients/current-slot', // 请确认此URL是否正确
    method: 'get'
  }).then(rawResponse => {
    console.log('收到后端原始响应:', rawResponse);

    let patientData = [];

    // 方案一：优先使用最直接的方式（适用于大多数情况）
    if (rawResponse && rawResponse.data && Array.isArray(rawResponse.data.data)) {
      patientData = rawResponse.data.data;
    }
    // 方案二：作为备用，直接解析原始响应字符串
    // 这可以绕过任何请求库的干扰，直接从你提供的JSON字符串中提取数据
    else {
      try {
        // 将原始响应转换为字符串，然后再解析成JSON对象
        const responseStr = typeof rawResponse === 'string' ? rawResponse : JSON.stringify(rawResponse);
        const parsedResponse = JSON.parse(responseStr);

        // 从解析后的对象中获取 data 数组
        if (parsedResponse && parsedResponse.data && Array.isArray(parsedResponse.data)) {
          patientData = parsedResponse.data;
          console.log('已通过备用方案成功解析病人数据。');
        } else {
          // 如果两种方案都失败，才真正抛出错误
          throw new Error('无法从响应中提取病人数据数组');
        }
      } catch (parseError) {
        throw new Error(`后端返回数据格式异常，无法解析: ${parseError.message}`);
      }
    }

    // 如果病人列表为空，直接更新状态
    if (patientData.length === 0) {
      console.log('后端返回的病人列表为空。');
      patients.value = [];
      currentPatient.value = null;
      localStorage.removeItem('patientResIds');
      return;
    }

    // 后续的数据处理逻辑保持不变
    const processedPatients = patientData.map((item, index) => {
      if (!item || typeof item !== 'object') {
        console.warn(`病人列表中第 ${index} 个元素不是有效对象，已跳过。`);
        return null;
      }

      const { age, gender } = calculateAgeAndGender(item.identity || '');

      return {
        id: item.resId || `PATIENT_${index}`,
        resId: item.resId || `PATIENT_${index}`,
        name: item.name || '未知姓名',
        identity: item.identity || '',
        phone: item.phone || '未知电话',
        createTime: item.createTime || new Date().toISOString(),
        gender: gender,
        age: age,
        queryIs: item.queryIs,
        status: index === 0 ? '就诊中' : '等待中',
        diagnosis: item.diagnosis || ''
      };
    }).filter(patient => patient !== null);

    patients.value = processedPatients;
    console.log('成功处理病人列表:', patients.value);

    if (patients.value.length > 0) {
          currentPatient.value = patients.value[0];
          currentResId.value = patients.value[0].resId || ''; // 同步ResId
        }

    localStorage.setItem('patientResIds', JSON.stringify(processedPatients.map(p => p.resId)));

  }).catch(error => {
    console.error('获取病人列表失败:', error.message);
    // 使用默认数据兜底
    patients.value = generateDefaultPatients();
    console.log('已加载默认病人数据。');

    localStorage.setItem('patientResIds', JSON.stringify(patients.value.map(p => p.resId)));

  });
};

// 3. 生成默认病人数据 (用于降级或测试)
const generateDefaultPatients = () => {
  const names = ['张明', '王丽', '李强', '赵雪', '刘洋', '陈静', '杨光', '黄薇', '周涛', '吴婷'];
  const patientList = [];

  for (let i = 0; i < 5; i++) { // 生成5个默认病人
    // 生成一个随机的18位身份证号
    const idCard = `330781${1990 + Math.floor(Math.random() * 30)}${String(Math.floor(Math.random() * 100)).padStart(2, '0')}${String(Math.floor(Math.random() * 100)).padStart(2, '0')}${Math.floor(Math.random() * 10)}`;

    // 使用上面的辅助函数计算年龄和性别
    const { age, gender } = calculateAgeAndGender(idCard);

    patientList.push({
      id: `DEFAULT_${i + 1}`,
      resId: `DEFAULT_${i + 1}`,
      name: names[Math.floor(Math.random() * names.length)],
      identity: idCard,
      phone: `138${Math.floor(Math.random() * 10000000)}`,
      createTime: new Date().toISOString(),
      gender: gender,
      age: age,
      status: i === 0 ? '就诊中' : '等待中',
      diagnosis: ''
    });
  }
  return patientList;
};
// 从后端获取康复建议数据
const fetchRehabAdvice = () => {
  request({
    url: '/rehab/advice',
    method: 'get'
  }).then(response => {
    if (response) {
      adviceData.value = response|| { sleep: [], sports: [], diet: [] }
    } else {
      throw new Error('康复建议数据格式不正确')
    }
  }).catch(error => {
    console.error('获取康复建议失败：', error)
    adviceData.value = {
      diet: ['饮食清淡', '少食多餐', '避免油腻', '多吃蔬果'],
      sports: ['适度运动', '避免久坐', '每日散步', '循序渐进'],
      sleep: ['保持规律作息', '避免熬夜', '睡前放松', '保证时长']
    }
  })
}

// 组件挂载时初始化
onMounted(() => {
  // 加载药品数据
  setTimeout(() => {
    if (medicineSearchRef.value) {
      medicineSearchRef.value.fetchMedicines('all')
    }
  }, 0)

   const savedRehabMode = localStorage.getItem('rehabilitation_mode');
   const savedDiet = localStorage.getItem('diet');
   const savedSports = localStorage.getItem('sports');
   const savedSleep = localStorage.getItem('sleep');
   const savedOther = localStorage.getItem('other');

    // 按存储值初始化状态
   if (savedRehabMode) rehabMode.value = savedRehabMode;
   if (savedDiet) rehabContent.value.diet = savedDiet;
   if (savedSports) rehabContent.value.sports = savedSports;
   if (savedSleep) rehabContent.value.sleep = savedSleep;
   if (savedOther) rehabContent.value.other = savedOther;

  // 获取病人列表
  fetchPatientsFromAPI()

  // 获取康复建议
  fetchRehabAdvice()

  //获取本科室问卷问题
  fetchAndSaveQuestionnaire()

  // 初始化本地存储
  const savedDiagnosis = localStorage.getItem('diagnosis')
  if (savedDiagnosis) {
    // 预留：回显诊断内容
  }
})

</script>

<style scoped>
/* 整体布局样式 */
.diagnosis-container {
  padding: 24px;
  background: linear-gradient(135deg, #f5f7fa 0%, #e4e8f0 100%);
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  gap: 20px;
  font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
}

.main-layout {
  display: flex;
  gap: 20px;
  flex: 1;
}

.left-panel {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 20px;
}

/* 右侧面板样式 */
.right-panel {
  width: 380px;
  display: flex;
  flex-direction: column;
  background: white;
  border-radius: 16px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  overflow: hidden;
}

/* 病人列表标题栏样式 */
.patient-list-header {
  padding: 16px 24px;
  border-bottom: 1px solid #f0f2f5;
  display: flex;
  justify-content: space-between;
  align-items: center;
  background: white;
}

.list-title {
  font-size: 18px;
  font-weight: 600;
  color: #1a1a1a;
  margin: 0;
}

.session-tag {
  margin-left: 12px;
  font-size: 14px;
  padding: 4px 10px;
  border-radius: 12px;
  background: #4a6cf7;
  color: white;
  font-weight: normal;
}

.patient-count {
  font-size: 14px;
  color: #8f9bb3;
  background: #f5f7fa;
  padding: 4px 12px;
  border-radius: 12px;
}

/* 响应式调整 */
@media (max-width: 768px) {
  .main-layout {
    flex-direction: column;
  }
  .right-panel {
    width: 100%;
  }
}
</style>